﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace HealthHelper
{
    public partial class FrmNotice : Form
    {

        /// <summary>
        /// 事件通知操作事件
        /// 0：设置
        /// 1：暂不休息
        /// 2：立即休息
        /// </summary>
        public event Action<int> NoticeOperEvent;

        /// <summary>
        /// 获取休息等待时间
        /// </summary>
        public event Func<int> GetRsetWaitSecondsEvent;

        //public event Action CloseEvent;

        private bool run = true;

        public FrmNotice()
        {
            InitializeComponent();
        }
        [DllImport("user32")]
        private static extern bool AnimateWindow(IntPtr hwnd, int dwTime, int dwFlags);

        //下面是可用的常量，根据不同的动画效果声明自己需要的
        private const int AW_HOR_POSITIVE = 0x0001;//自左向右显示窗口，该标志可以在滚动动画和滑动动画中使用。使用AW_CENTER标志时忽略该标志
        private const int AW_HOR_NEGATIVE = 0x0002;//自右向左显示窗口，该标志可以在滚动动画和滑动动画中使用。使用AW_CENTER标志时忽略该标志
        private const int AW_VER_POSITIVE = 0x0004;//自顶向下显示窗口，该标志可以在滚动动画和滑动动画中使用。使用AW_CENTER标志时忽略该标志
        private const int AW_VER_NEGATIVE = 0x0008;//自下向上显示窗口，该标志可以在滚动动画和滑动动画中使用。使用AW_CENTER标志时忽略该标志该标志
        private const int AW_CENTER = 0x0010;//若使用了AW_HIDE标志，则使窗口向内重叠；否则向外扩展
        private const int AW_HIDE = 0x10000;//隐藏窗口
        private const int AW_ACTIVE = 0x20000;//激活窗口，在使用了AW_HIDE标志后不要使用这个标志
        private const int AW_SLIDE = 0x40000;//使用滑动类型动画效果，默认为滚动动画类型，当使用AW_CENTER标志时，这个标志就被忽略
        private const int AW_BLEND = 0x80000;//使用淡入淡出效果


        private void FrmNotice_Load(object sender, EventArgs e)
        {
            this.TopMost = true;
            int x = Screen.PrimaryScreen.WorkingArea.Right - this.Width - 20;
            int y = Screen.PrimaryScreen.WorkingArea.Bottom - this.Height - 10;
            this.Location = new Point(x, y);//设置窗体在屏幕右下角显示
            SetRsetWaitSeconds();
            // 定时器
            new Thread(Timer_Elapsed).Start();
            AnimateWindow(this.Handle, 500, AW_SLIDE | AW_ACTIVE | AW_VER_NEGATIVE);

        }

        private void FrmNotice_FormClosing(object sender, FormClosingEventArgs e)
        {
            run = false;
            //CloseEvent?.Invoke();
            AnimateWindow(this.Handle, 500, AW_BLEND | AW_HIDE);
        }

        private void Timer_Elapsed()
        {
            while (run)
            {
                // 没有设置事件，直接关闭窗体
                if (!SetRsetWaitSeconds())
                {
                    this.Invoke(new Action(() => { this.Close(); }));
                    return;
                }
                Thread.Sleep(500);
            }
        }

        private bool SetRsetWaitSeconds()
        {
            int? countdownSeconds = GetRsetWaitSecondsEvent?.Invoke();
            if (!countdownSeconds.HasValue || countdownSeconds.Value <= 0)
            {
                return false;
            }
            this.lb_Msg.Invoke(new Action(() =>
            {
                lb_Msg.Text = countdownSeconds.Value.ToString() + "秒后开始休息";
            }));
            return true;
        }


        private void llb_NoRest_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            NoticeOperEvent?.Invoke(1);
            this.Close();
        }

        private void btn_NowRest_BtnClick(object sender, EventArgs e)
        {
            NoticeOperEvent?.Invoke(2);
            this.Close();
        }

        private void lb_Set_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            NoticeOperEvent?.Invoke(0);
        }
    }
}
